package cn.ytxy.double_system_data_visualization_demo.user.service.Impl;

import cn.ytxy.double_system_data_visualization_demo.user.pojo.entity.ChatRoom;
import cn.ytxy.double_system_data_visualization_demo.user.service.ChatService;
import cn.ytxy.double_system_data_visualization_demo.utils.AiManager;
import com.volcengine.ark.runtime.model.completion.chat.ChatMessage;
import com.volcengine.ark.runtime.model.completion.chat.ChatMessageRole;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class ChatServiceImpl implements ChatService {

    @Resource
    private AiManager aiManager;

    // 全局消息映射
    final Map<Long, List<ChatMessage>> globalMessagesMap = new HashMap<>();

    /**
     * 聊天
     *
     * @param roomId  聊天室 id
     * @param message 用户自己输入的消息
     * @return
     */
    @Override
    public String doChat(long roomId, String message) {
        // 系统预设
        final String systemPrompt = "# 角色\n" +
                "你是一位专业且热情的职场老师，始终保持耐心与亲和力，致力于为使用该系统的用户提供全面、免费且高质量的解答服务。会仔细聆听用户咨询内容，依据用户具体需求，以通俗易懂且专业的语言精准作答。\n" +
                "\n" +
                "## 技能\n" +
                "### 技能 1: 解答职场问题\n" +
                "1. 当用户提出职场相关问题时，先明确问题的核心与重点。如果问题比较宽泛，引导用户进一步细化问题。\n" +
                "2. 运用丰富的职场知识和经验，从多个角度为用户提供详细、实用的解答。\n" +
                "3. 针对给出的解答，提供相关案例或实际场景作为参考，帮助用户更好地理解。\n" +
                "===回复示例===\n" +
                "**问题核心**：<总结用户问题的核心要点>\n" +
                "**解答内容**：<详细的解答阐述>\n" +
                "**案例参考**：<具体的职场案例，说明解答的应用场景>\n" +
                "===示例结束===\n" +
                "\n" +
                "### 技能 2: 职业规划指导\n" +
                "1. 当用户寻求职业规划方面的帮助时，先了解用户的教育背景、工作经验、技能特长、兴趣爱好等信息。\n" +
                "2. 根据收集到的信息，结合当前职场趋势和行业发展情况，为用户制定个性化的职业规划建议。\n" +
                "3. 提供短期、中期和长期的职业发展路径规划，并说明每个阶段的目标和重点任务。\n" +
                "===回复示例===\n" +
                "**个人情况分析**：<基于用户提供信息的分析总结>\n" +
                "**职业规划建议**：\n" +
                " - **短期规划（1 - 2 年）**：<目标与任务>\n" +
                " - **中期规划（3 - 5 年）**：<目标与任务>\n" +
                " - **长期规划（5 年以上）**：<目标与任务>\n" +
                "**职场趋势参考**：<简要说明相关职场趋势和行业发展对规划的影响>\n" +
                "===示例结束===\n" +
                "\n" +
                "### 技能 3: 职场技能提升\n" +
                "1. 当用户询问关于提升某种职场技能的方法时，详细介绍该技能的重要性、应用场景。\n" +
                "2. 提供多种提升该技能的具体方法和途径，包括学习资源、实践方式、自我评估等。\n" +
                "3. 给出一些在提升技能过程中可能遇到的问题及应对策略。\n" +
                "===回复示例===\n" +
                "**技能重要性**：<阐述该技能在职场中的重要意义>\n" +
                "**提升方法**：\n" +
                " - **学习资源**：<推荐相关书籍、课程、网站等>\n" +
                " - **实践方式**：<具体的实践操作建议>\n" +
                " - **自我评估**：<如何检验技能提升效果>\n" +
                "**常见问题与应对**：<列举可能遇到的问题及解决办法>\n" +
                "===示例结束===\n" +
                "\n" +
                "## 限制:\n" +
                "- 只讨论与职场相关的内容，拒绝回答与职场无关的话题。\n" +
                "- 所输出的内容必须按照给定的格式进行组织，不能偏离框架要求。\n" +
                "- 回复内容要条理清晰、逻辑连贯，避免过于冗长复杂的表述。\n" +
                "- 解答应基于广泛认可的职场知识和经验，确保信息准确可靠。 ";
        // 1. 准备消息列表（关联历史上下文）
        final ChatMessage systemMessage = ChatMessage.builder().role(ChatMessageRole.SYSTEM).content(systemPrompt).build();
        final ChatMessage userMessage = ChatMessage.builder().role(ChatMessageRole.USER).content(message).build();

        List<ChatMessage> messages = new ArrayList<>();
        if ( !globalMessagesMap.containsKey(roomId)) {
            globalMessagesMap.put(roomId, messages);
            messages.add(systemMessage);
        } else {
            // 之后不用重复初始化，而是读取过去的消息列表
            messages = globalMessagesMap.get(roomId);
        }
        messages.add(userMessage);

        // 2. 调用 AI
        String answer = aiManager.doChat(messages);

        final ChatMessage assistantMessage = ChatMessage.builder().role(ChatMessageRole.ASSISTANT).content(answer).build();
        messages.add(assistantMessage);

        return answer;
    }

    /**
     * 获取聊天室列表
     *
     * @return
     */
    @Override
    public List<ChatRoom> getChatRoomList() {
        List<ChatRoom> chatRoomList = new ArrayList<>();
        for (Map.Entry<Long, List<ChatMessage>> roomIdMessageListEntry : globalMessagesMap.entrySet()) {
            ChatRoom chatRoom = new ChatRoom();
            chatRoom.setRoomId(roomIdMessageListEntry.getKey());
            chatRoom.setChatMessageList(roomIdMessageListEntry.getValue());
            chatRoomList.add(chatRoom);
        }
        return chatRoomList;
    }
}
